class Solution(object):
    """
    方法：双指针法
    先对数组排序，然后固定一个数，使用双指针在剩余数组中寻找两数之和等于固定数的相反数
    
    Args:
        nums: List[int], 输入数组
        
    Returns:
        List[List[int]]: 所有满足条件的三元组列表
        
    Time: O(n^2), 排序O(nlogn)，外层循环O(n)，内层双指针O(n)
    Space: O(1), 除了存储结果外，只使用了常数空间
    """
    def threeSum(self, nums):
        nums.sort()
        n = len(nums)
        ans = []
        for i in range(n - 2):
            if nums[i] > 0:
                break;
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            left, right = i + 1, n - 1
            while left < right :
                total = nums[i] + nums[left] + nums[right]
                if total == 0:
                    ans.append([nums[i], nums[left], nums[right]])
                    while left < right and nums[left] == nums[left + 1]:
                        left += 1
                    while left < right and nums[right] == nums[right - 1]:
                        right -= 1
                    left += 1
                    right -= 1
                elif total < 0:
                    left += 1
                else:
                    right -= 1
        return ans